package com.shy.base.util;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串操作工具类
 * 
 * @author H2013788
 */
public class StringUtils extends org.apache.commons.lang.StringUtils {

    /**
     * 半角转全角
     * 
     * @param input
     *            输入字符串参数
     * @return 全角字符串.
     */
    public static String convert2DoubleByte(String input) {
        char[] c = input.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == ' ') {
                c[i] = '\u3000';
            } else if (c[i] < '\177') {
                c[i] = (char) (c[i] + 65248);
            }
        }
        return new String(c);
    }

    /**
     * 判断是否包含中文字符
     * 
     * @param sourceStr
     *            输入字符串
     * @return
     */
    public static boolean containsChinese(String sourceStr) {
        if (!isNotEmpty(sourceStr)) {
            return false;
        }
        char[] charArray = sourceStr.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            // 中文的编码区间为：0x4e00--0x9fbb，利用Unicode编码来判断
            if ((charArray[i] >= 0x4e00) && (charArray[i] <= 0x9fbb)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 将字符串按照指定分隔符拆分成list
     * 
     * @param sourceStr
     *            输入字符串
     * @param split
     *            分隔符
     * @return
     * @author shy
     * @date 2017-1-13 下午04:30:41
     */
    public static List<String> splitStr(String sourceStr, String split) {
        return Arrays.asList(sourceStr.split(split));
    }

    /**
     * 字符替换
     * 
     * @param input
     *            输入字符串
     * @param fromStr
     *            替换内容
     * @param toStr
     *            替换结果
     * @return
     * @author shy
     * @date 2016-11-28 下午05:54:43
     */
    public static String replaceStr(String input, String fromStr, String toStr) {
        if (null != input && !"".equals(input)) {
            return input.replaceAll(fromStr, toStr);
        }
        return "";
    }

    /**
     * 替换特殊字符
     * 
     * @param sourceStr
     *            输入字符串
     * @return
     */
    public static String replaceXmlSpecialChar(String sourceStr) {
        if (!isNotEmpty(sourceStr)) {
            return "";
        }
        return sourceStr.replace("©", "&#169;").replace("*", "&#42;").replace("—", "&#8212;")
                .replace("&gt;", "&#62;").replace("&lt;", "&#60;");
    }

    /**
     * 获取日期中的年
     * 
     * @param curDate
     *            当前日期
     * @return
     * @author H2013788
     * @date 2017/11/22下午7:44:52
     */
    public static String getYear(Date curDate) {
        if (curDate == null) {
            return "";
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(curDate);
        return cal.get(Calendar.YEAR) + "";
    }

    /**
     * 获取日期中的月
     * 
     * @param curDate
     *            当前日期
     * @return
     * @author H2013788
     * @date 2017/11/22下午7:45:04
     */
    public static String getMonth(Date curDate) {
        if (curDate == null) {
            return "";
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(curDate);
        return cal.get(Calendar.MONTH) + "";
    }

    /**
     * 获取日期中的日
     * 
     * @param curDate
     *            当前日期
     * @return
     * @author H2013788
     * @date 2017/11/22下午7:45:13
     */
    public static String getDay(Date curDate) {
        if (curDate == null) {
            return "";
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(curDate);
        return cal.get(Calendar.DATE) + "";
    }

    /**
     * 按照指定格式格式化日期
     * 
     * @param pattern
     *            日期格式
     * @param sourceDate
     *            日期
     * @return
     * @author H2013788
     * @date 2017/11/22下午7:45:32
     */
    public static String convertDate2Str(String pattern, Date sourceDate) throws Exception{
        if (sourceDate == null) {
            return "";
        }
        return DateUtils.dateConvert2Str(pattern, sourceDate);
    }

    /**
     * 按照指定格式格式化日期，支持中英文
     * 
     * @param pattern
     *            日期格式
     * @param sourceDate
     *            日期源
     * @param language
     *            语言
     * @return
     * @author H2013788
     * @date 2017/11/22下午7:45:52
     */
    public static String convertDate2Str(String pattern, Date sourceDate, String language)  throws Exception{
        if (sourceDate == null) {
            return "";
        }
        if ("en".equals(language)) {
            return DateUtils.dateConvert2StrEn(pattern, sourceDate);
        } else {
            return DateUtils.dateConvert2Str(pattern, sourceDate);
        }
    }

    /**
     * 字符串截取
     * 
     * @param sourceStr
     *            输入字符串
     * @param start
     *            截取开始
     * @param end
     *            截取结束
     * @return
     * @author H2013788
     * @date 2017/11/22下午8:10:16
     */
    public String subStr(String sourceStr, int start, int end) {
        if (StringUtils.isEmpty(sourceStr)) {
            return "";
        }
        return sourceStr.substring(start, end);
    }

    /**
     * 截取字符串
     * 
     * @param sourceStr
     *            字符串
     * @param keeplength
     *            保留长度
     * @return
     * @author shy
     * @date 2017-1-19 下午04:14:01
     */
    public static String subText(String sourceStr, Integer keeplength) {
        if (null != sourceStr && !"".equals(sourceStr)) {
            boolean requireSubText = sourceStr.length() >= keeplength;
            String subStr = sourceStr
                    .substring(0, requireSubText ? keeplength : sourceStr.length());
            subStr += requireSubText ? "..." : "";
            return subStr;
        }
        return "";
    }

    /**
     * 判断字符串数组是否包含字符串
     * 
     * @param array
     *            数组
     * @param str
     *            要查询被包含的字符串
     * @return
     * @author shy
     * @date 2017-2-20 上午10:36:25
     */
    public static boolean arrayContainsStr(String[] array, String str) {
        if (null != array && array.length > 0 && null != str && !"".equals(str)) {
            for (String string : array) {
                if (string.equals(str)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 格式化字符串，转换为大写或者小写
     * 
     * @param sourceStr
     *            源字符串
     * @param formatType
     *            格式化方式UP:LOW
     * @return
     * @author shy
     * @date 2017-2-28 上午10:48:12
     */
    public static String convertToLocalOrUpper(String sourceStr, String formatType) {
        if (null == sourceStr || StringUtils.isEmpty(sourceStr)) {
            return "";
        }
        return "UP".equals(formatType.trim().toUpperCase()) ? sourceStr.toUpperCase() : sourceStr
                .toLowerCase();
    }

    /**
     * 获取正则匹配信息
     * 
     * @param source
     *            原字符串
     * @param regx
     *            正则
     * @param index
     *            返回第几个匹配项
     * @return
     * @author shy
     * @date 2017-4-10 下午03:56:44
     */
    public static String getMatherByIndex(String source, String regx, int index) {
        Pattern pattern = Pattern.compile(regx); // 编译正则表达式
        Matcher matcher = pattern.matcher(source); // 执行匹配操作的引擎
        while (matcher.find()) {
            return null == matcher.group(index) ? "" : matcher.group(index);
        }
        return "";
    }
    
    public static String getDateStr(Date date, String dateFormat) {
        String df = dateFormat, strNow;
        
        if (df == null || df.equals("")) {
            df = "yyyy/MM/dd HH:mm:ss";
        }
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(df);
            strNow = sdf.format(date);
        } catch (Exception e) {
            strNow = "";
        }
        return strNow;
    }
    
    
    /**
     * List<Object>轉換為List<Map<String, Object>>
     * @param strs
     * @param result
     * @return
     */
    public static List<Map<String, Object>> listToMapList(String[] strs, List<?> result) {
        List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();
        for(int i=0; i<result.size(); i++){
            Object[] objs = (Object[]) result.get(i);
            Map<String, Object> map = new HashMap<String, Object>();
            for(int j=0; j<strs.length; j++){
                String[] strss = strs[j].split(";");
                if(strss.length == 1){
                    map.put(strss[0], objs[j]);
                }else if(strss.length == 2){
                    if(strss[1].toUpperCase().equals("D")){ 
                        map.put(strss[0], StringUtils.getDateStr((Date)objs[j], null));
                    }
                }
            }
            mapList.add(map);
        }
        return mapList; 
    }
    
}
